package reflect01;

import org.junit.Test;

/**
 * 反射的第一步获取字节码对象,因为只有获取到字节码对象,才能进一步获取类中的信息
 * 三种方式:
 *   1.类名.class 代表一个字节码对象
 *   2.通过Class类的方法,所有的字节码对象都是Class类的实例
 *     static Class<?> forName(String className)
 *           返回与带有给定字符串名的类或接口相关联的 Class 对象。
 *   3.通过Object类中的getClass()方法获取该类的字节码对象
 *      Class<?> getClass()
 *           返回此 Object 的运行时类。
 *   无论采用哪种方式获取该类的字节码对象,都是获取的同一个字节码对象
 */
public class ReflectDemo01 {
    @Test  //1.类名.class 代表一个字节码对象
    public void testMethod01(){
        System.out.println(Person.class);// class reflect01.Person  包名.类名
    }

    @Test // 2.通过Class类的方法,所有的字节码对象都是Class类的实例
    public void testMethod02() throws ClassNotFoundException {
        Class p = Class.forName("reflect01.Person");
        System.out.println(p); // class reflect01.Person
    }

    @Test // 3.通过Object类中的getClass()方法获取该类的字节码对象
    public void testMethod03(){
        Person p = new Person();
        System.out.println(p.getClass()); //  class reflect01.Person
    }

    @Test
    public void testMethod04() throws ClassNotFoundException {
        Class<Person> p1 = Person.class;
        Class<?> p2 = Class.forName("reflect01.Person");
        Class p3 = new Person().getClass();
        System.out.println(p1==p2); // true
        System.out.println(p1==p3); // true
        System.out.println(p2==p2); // true
        // 无论采用哪种方式获取该类的字节码对象,都是获取的同一个字节码对象
    }
}

